More x86_64 fixes.
Signed-off-by: keir.fraser@cl.cam.ac.uk
{
struct mc_state *mcs = &mc_state[smp_processor_id()];
execution_context_t *ec;
- unsigned long *preg;
unsigned int i;
va_list args;
ec->eax = op;
ec->eip -= 2; /* re-execute 'int 0x82' */
- for ( i = 0, preg = &ec->ebx; i < nr_args; i++, preg++ )
- *preg = va_arg(args, unsigned long);
-#else
- preg = NULL; /* XXX x86/64 */
+ for ( i = 0; i < nr_args; i++ )
+ {
+ switch ( i )
+ {
+ case 0: ec->ebx = va_arg(args, unsigned long); break;
+ case 1: ec->ecx = va_arg(args, unsigned long); break;
+ case 2: ec->edx = va_arg(args, unsigned long); break;
+ case 3: ec->esi = va_arg(args, unsigned long); break;
+ case 4: ec->edi = va_arg(args, unsigned long); break;
+ case 5: ec->ebp = va_arg(args, unsigned long); break;
+ }
+ }
+#elif defined(__x86_64__)
+ ec->rax = op;
+ ec->rip -= 2; /* re-execute 'syscall' */
+
+ for ( i = 0; i < nr_args; i++ )
+ {
+ switch ( i )
+ {
+ case 0: ec->rdi = va_arg(args, unsigned long); break;
+ case 1: ec->rsi = va_arg(args, unsigned long); break;
+ case 2: ec->rdx = va_arg(args, unsigned long); break;
+ case 3: ec->r10 = va_arg(args, unsigned long); break;
+ case 4: ec->r8 = va_arg(args, unsigned long); break;
+ case 5: ec->r9 = va_arg(args, unsigned long); break;
+ }
+ }
#endif
}
#include <asm/apicdef.h>
#include <public/xen.h>
+
+/*
+ * %rax = hypercall vector
+ * %rdi, %rsi, %rdx, %r10, %r8, %9 = hypercall arguments
+ * %r11, %rcx = SYSCALL-saved %rflags and %rip
+ * NB. We must move %r10 to %rcx for C function-calling ABI.
+ */
ENTRY(hypercall)
sti
movl $__GUEST_SS,8(%rsp)
pushq %rcx
pushq $0
SAVE_ALL
+ movq %r10,%rcx
andq $(NR_hypercalls-1),%rax
leaq SYMBOL_NAME(hypercall_table)(%rip),%rcx
callq *(%rcx,%rax,8)
error_code:
SAVE_ALL
+ sti
movq %rsp,%rdi
movl XREGS_entry_vector(%rsp),%eax
leaq SYMBOL_NAME(exception_table)(%rip),%rdx
* XEN "SYSTEM CALLS" (a.k.a. HYPERCALLS).
*/
-/* EAX = vector; EBX, ECX, EDX, ESI, EDI = args 1, 2, 3, 4, 5. */
+/*
+ * x86_32: EAX = vector; EBX, ECX, EDX, ESI, EDI = args 1, 2, 3, 4, 5.
+ * EAX = return value
+ * (argument registers may be clobbered on return)
+ * x86_64: RAX = vector; RDI, RSI, RDX, R10, R8, R9 = args 1, 2, 3, 4, 5, 6.
+ * RAX = return value
+ * (argument registers not clobbered on return; RCX, R11 are)
+ */
#define __HYPERVISOR_set_trap_table 0
#define __HYPERVISOR_mmu_update 1
#define __HYPERVISOR_set_gdt 2